package com.efrei.schoolmanager.views;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.util.List;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.text.MaskFormatter;

import com.efrei.schoolmanager.controlers.ControleurEleve;
import com.efrei.schoolmanager.exceptions.LogicException;
import com.efrei.schoolmanager.model.obj.Pays;
import com.efrei.schoolmanager.tools.Tools;
import com.efrei.schoolmanager.views.components.CustomButton;
import com.efrei.schoolmanager.views.components.CustomFormattedTextField;
import com.efrei.schoolmanager.views.components.CustomTextField;

public class VueAjouterResponsable extends JDialog {
	private static final long serialVersionUID = 4139080695550578427L;

	private final static String TITLE = "Ajouter un responsable";

	// Proprietaire de cette dialog(objectif: rendre modale la jdialog)
	private final JFrame proprio;
	private final VueAjouterResponsable vueActuelle;

	// JPanels
	private JPanel titlePanel, mainPanel, infoPanel, validationPanel;

	// JLabels
	private JLabel titleLabel, prenomLabel, nomLabel, rueLabel, villeLabel,
			codePostalLabel, paysLabel, emailLabel, telFixeLabel,
			telMobileLabel, telProLabel;

	// JTextFields
	private CustomTextField prenomTextField, nomTextField, rueTextField,
			villeTextField, emailTextField;

	// JFormattedTextField
	private CustomFormattedTextField codePostalTextField, telFixeTextField,
			telMobileTextField, telProTextField;

	// JComboBox
	private JComboBox paysComboBox;

	// CustomButton
	private CustomButton ajouterResponsableButton, annulerButton;

	private final ControleurEleve controleur;

	public VueAjouterResponsable(JFrame proprio, ControleurEleve controleur) {
		super(proprio, TITLE, true);
		this.proprio = proprio;
		vueActuelle = this;

		// Mise en place du controleur
		this.controleur = controleur;

		initLabels();
		initTextFields();
		initComboBox();
		initButtons();
		remplirTitlePanel();
		remplirInfoPanel();
		remplirValidationPanel();
		remplirMainPanel();
		configurerVue();
	}

	private void remplirTitlePanel() {
		titlePanel = new JPanel();
		titlePanel.add(titleLabel);
	}

	private void remplirMainPanel() {
		mainPanel = new JPanel();
		// Gestionnaire de positionnement
		GroupLayout layout = new GroupLayout(mainPanel);
		mainPanel.setLayout(layout);
		// Espacement des composants
		layout.setAutoCreateGaps(true);
		// Espacement entre composants et conteneur
		layout.setAutoCreateContainerGaps(true);

		// Groupe sequentiel sur l'axe horizontal
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
		// 1e colonne
		hGroup.addGroup(layout.createParallelGroup().addComponent(infoPanel)
				.addComponent(validationPanel));
		layout.setHorizontalGroup(hGroup);

		// Groupe sequentiel sur l'axe vertical
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
		// 1e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(infoPanel));
		// 2e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(validationPanel));
		layout.setVerticalGroup(vGroup);
	}

	private void remplirValidationPanel() {
		validationPanel = new JPanel();
		validationPanel.add(ajouterResponsableButton);
		validationPanel.add(annulerButton);
	}

	private void remplirInfoPanel() {
		infoPanel = new JPanel();
		// Gestionnaire de positionnement
		GroupLayout layout = new GroupLayout(infoPanel);
		infoPanel.setLayout(layout);
		// Espacement des composants
		layout.setAutoCreateGaps(true);
		// Espacement entre composants et conteneur
		layout.setAutoCreateContainerGaps(true);

		// Groupe sequentiel sur l'axe horizontal
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
		// 1e colonne
		hGroup.addGroup(layout.createParallelGroup().addComponent(prenomLabel)
				.addComponent(rueLabel).addComponent(codePostalLabel)
				.addComponent(emailLabel).addComponent(telMobileLabel));
		// 2e colonne
		hGroup.addGroup(layout.createParallelGroup()
				.addComponent(prenomTextField).addComponent(rueTextField)
				.addComponent(codePostalTextField).addComponent(emailTextField)
				.addComponent(telMobileTextField));
		// 3e colonne
		hGroup.addGroup(layout.createParallelGroup().addComponent(nomLabel)
				.addComponent(villeLabel).addComponent(paysLabel)
				.addComponent(telFixeLabel).addComponent(telProLabel));
		// 4e colonne
		hGroup.addGroup(layout.createParallelGroup().addComponent(nomTextField)
				.addComponent(villeTextField).addComponent(paysComboBox)
				.addComponent(telFixeTextField).addComponent(telProTextField));
		layout.setHorizontalGroup(hGroup);

		// Groupe sequentiel sur l'axe vertical
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
		// 1e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(prenomLabel).addComponent(prenomTextField)
				.addComponent(nomLabel).addComponent(nomTextField));
		// 2e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(rueLabel).addComponent(rueTextField)
				.addComponent(villeLabel).addComponent(villeTextField));
		// 3e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(codePostalLabel)
				.addComponent(codePostalTextField).addComponent(paysLabel)
				.addComponent(paysComboBox));
		// 4e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(emailLabel).addComponent(emailTextField)
				.addComponent(telFixeLabel).addComponent(telFixeTextField));
		// 5e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(telMobileLabel).addComponent(telMobileTextField)
				.addComponent(telProLabel).addComponent(telProTextField));
		layout.setVerticalGroup(vGroup);

	}

	/**
	 * Configurer les options de la vue
	 */
	private void configurerVue() {
		setLayout(new BorderLayout());
		this.add(titlePanel, BorderLayout.NORTH);
		this.add(mainPanel, BorderLayout.CENTER);
		Dimension preferedSize = getPreferredSize();
		Dimension dimensionIdeale = new Dimension(preferedSize.width,
				preferedSize.height + 28);
		setMinimumSize(dimensionIdeale);
		setSize(dimensionIdeale);
		this.setLocationRelativeTo(proprio);
		setVisible(true);
	}

	private void initButtons() {
		AjouterResponsableButtonListener ajouterResponsableListener = new AjouterResponsableButtonListener();
		AnnulerButtonListener annulerListener = new AnnulerButtonListener();
		ajouterResponsableButton = new CustomButton("Ajouter responsable");
		ajouterResponsableButton.addActionListener(ajouterResponsableListener);
		annulerButton = new CustomButton("Annuler");
		annulerButton.addActionListener(annulerListener);
	}

	private void initComboBox() {
		// Recuperation des pays
		paysComboBox = new JComboBox();
		paysComboBox.addItem("--Liste des pays--");
		try {
			List<Pays> listPays = controleur.getPays();
			for (Pays pays : listPays) {
				// Affectation a la combobox grace à toString
				paysComboBox.addItem(pays);
			}
		} catch (Exception e) {
			System.err.println("Erreur de recuperation des pays");
			e.printStackTrace();
		}

		Dimension preferedSize = paysComboBox.getPreferredSize();
		Dimension newSize = new Dimension(preferedSize.width + 20,
				preferedSize.height);
		paysComboBox.setPreferredSize(newSize);
	}

	private void initLabels() {
		titleLabel = new JLabel(TITLE);
		titleLabel.setFont(new Font("Arial", Font.BOLD, 20));
		prenomLabel = new JLabel("Prenom:");
		nomLabel = new JLabel("Nom:");
		rueLabel = new JLabel("Rue:");
		villeLabel = new JLabel("Ville:");
		codePostalLabel = new JLabel("Code postal:");
		paysLabel = new JLabel("Pays:");
		emailLabel = new JLabel("E-mail:");
		telFixeLabel = new JLabel("Telephone fixe:");
		telMobileLabel = new JLabel("Telephone mobile:");
		telProLabel = new JLabel("Telephone pro:");
	}

	private void initTextFields() {
		/* Text fields */
		prenomTextField = new CustomTextField("");
		nomTextField = new CustomTextField("");
		rueTextField = new CustomTextField("");
		villeTextField = new CustomTextField("");
		emailTextField = new CustomTextField("");

		/* Formated text fields */
		try {
			// Code postal d'exactement cinq chiffres
			MaskFormatter codePostalMask = new MaskFormatter("#####");
			// Num�ro de t�lephone d'exactement dix chiffres
			MaskFormatter telephoneMask = new MaskFormatter("##########");
			// Codes postaux
			codePostalTextField = new CustomFormattedTextField(codePostalMask);
			// Telephones
			telFixeTextField = new CustomFormattedTextField(telephoneMask);
			telMobileTextField = new CustomFormattedTextField(telephoneMask);
			telProTextField = new CustomFormattedTextField(telephoneMask);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Ferme la fenetre et libere les ressources
	 * 
	 */
	public void fermerVue() {
		this.setVisible(false);
		this.dispose();

	}

	/* Listeners */
	class AjouterResponsableButtonListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			String title = "Erreur avec le responsable";

			// enregistrement du responsable
			String nom = nomTextField.getText();
			String prenom = prenomTextField.getText();
			String rue = rueTextField.getText();
			String codePostal = codePostalTextField.getText();
			String nomVille = villeTextField.getText();
			String telephoneFixe = telFixeTextField.getText();
			String telephoneMobile = telMobileTextField.getText();
			String telephoneProfessionnel = telProTextField.getText();
			String email = emailTextField.getText();
			if (paysComboBox.getSelectedIndex() == 0) {
				Tools.displayError("Pays non sélectionné !", title);
			} else {
				try {
					controleur.ajoutResponsable(nom, prenom, rue, codePostal,
							nomVille, (Pays) paysComboBox.getSelectedItem(),
							telephoneFixe, telephoneMobile, telephoneProfessionnel,
							email);
					// Fermer la vue
					vueActuelle.fermerVue();
				} catch (LogicException ex) {
					Tools.displayError(ex.getMessage(), title);
				} catch (Exception ex) {
					// Echec de l'ajout du responsable
					ex.printStackTrace();
					Tools.displayError("Erreur inconnue: " + ex.getMessage(), title);
				}
			}
		}
	}

	class AnnulerButtonListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			// Fermer la vue sans rien ajouter
			vueActuelle.fermerVue();
		}
	}

}
